파이썬 자료구조(세트, 내장자료형)

세트(Set)

세트는 유일한 원소만 담는 정렬되지 않은 자료형이다. 딕셔너리와 유사하지만 값(value)은 없고 키(key)만 가지고 있다. 세트는 set( ) 함수를 이용하거나 중괄호 {}를 이용해서 생성할 수 있다.

선언 및 값 할당

s1 = set([2, 2, 2, 1, 3, 3])
print(s1) # {1, 2, 3}

s1 = {2, 2, 2, 1, 3, 3}
print(s1) # {1, 2, 3}

원소 추가 및 삭제하기

세트에 원소를 추가하는 메소드는 add()이며, 삭제하기 위한 메소드는 remove()이다.

a_set = {1, 2, 3, 4, 5}
a_set.add(6)
print(a_set) # {1, 2, 3, 4, 5, 6}
a_set.remove(3)
print(a_set) # {1, 2, 4, 5, 6}

집합연산

세트는 합집합, 교집합, 대칭차집합 같은 산술 집합 연산을 제공한다.

a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7, 8}

# 합집합(or)
print(a | b) # {1, 2, 3, 4, 5, 6, 7, 8}
print(a.union(b)) # {1, 2, 3, 4, 5, 6, 7, 8}

# 교집합(and)
print(a & b) # {3, 4, 5}
print(a.intersection(b)) # {3, 4, 5}

# 차집합
print(a - b) # {1, 2}
print(a.difference(b)) # {1, 2}

# 대칭차집합(xor)
print(a ^ b) # {1, 2, 6, 7, 8}
print(a.symmetric_difference(b)) # {1, 2, 6, 7, 8}

한 세트가 다른 세트의 부분 집합인지, 확대 집합인지도 검사할 수 있다.

a_set = {1, 2, 3, 4, 5}
print({1, 2, 3}.issubset(a_set)) # True
print(a_set.issuperset({1, 2, 3})) # True

== 연산자를 사용해서 두 세트의 내용이 같은지도 검사할 수 있다.

print({1, 2, 3} == {3, 2, 1})

세트 컴프리헨션

세트 컴프리헨션은 리스트 컴프리헨션의 구문에서 대괄호 대신 중괄호를 사용하면 된다.

strings = ['a', 'as', 'bat', 'car', 'dove', 'python']
uniq_lengths = {len(x) for x in strings}
print(uniq_lengths) # {1, 2, 3, 4, 6}


내장자료형

파이썬은 순차 자료형에 사용할 수 있는 매우 유용한 함수를 제공한다.

enumerate

enumerate() 함수는 순차 자료형에서 현재 아이템의 색인을 함께 처리하고자 할 때 사용된다. enumerate를 사용하는 유용한 패턴은 순차 자료형에서의 값과 그 위치를 dict에 넘겨주는 것이다.

some_list = ['foo', 'bar', 'baz']
mapping = dict((v, i) for i, v in enumerate(some_list))
print(mapping) # {'foo': 0, 'bar': 1, 'baz': 2}

sorted

sorted() 함수는 정렬된 새로운 순차 자료형을 반환한다.

print(sorted([7, 1, 2, 6, 0, 3, 2])) # [0, 1, 2, 2, 3, 6, 7]
print(sorted('horse race')) # [' ', 'a', 'c', 'e', 'e', 'h', 'o', 'r', 'r', 's']

zip

zip() 함수는 여러 개의 리스트나 튜플 또는 다른 순차 자료형을 서로 짝지어서 튜플의 리스트를 생성한다.

seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
zip(seq1, seq2)

zip() 함수는 여러 개의 순차 자료형을 동시에 순회하는 경우 enumerate() 함수와 함께 사용되기도 한다.

for i, (a, b) in enumerate(zip(seq1, seq2)):
print("%d: %s, %s" % (i, a, b))
print("{:d}: {}, {}".format(i, a, b))
print(f'{i:d}: {a}, {b}')
# 0: foo, one
# 1: bar, two
# 2: baz, three

zip() 함수를 사용해서 짝지어진 순차 자료형을 다시 풀어낼 수도 있다. 이를 이용하면 리스트의 행을 리스트의 컬럼으로 변환할 수 있다.

pitchers = [('Nolan', 'Ryan'), ('Roger', 'Clemens'),
('Schilling', 'Curt'), ('Chan Ho', 'Park')]
first_names, last_names = zip(*pitchers)
print(first_names) # ('Nolan', 'Roger', 'Schilling', 'Chan Ho')
print(last_names) # ('Ryan', 'Clemens', 'Curt', 'Park')

reversed

reversed()함수는 순차 자료형을 역순으로 순회한다.

print(list(reversed(range(10)))) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Share